import method.TemplateClass;
import method.impl.TemplateClassImplement1;
import method.impl.TemplateClassImplement2;

/**
 * @author 粥灰灰
 * 模板方法举例：
 * 类似于回调，父类定义一个抽象方法，然后在一系列固定的复杂业务流程中调用
 * 并且将其模板方法暴露给开发者，使得开发者只需要实现对应子类即可达成自定义配置参与该固定业务流程的目的。
 * 通常用于业务中有大部分相同的固定流程，只有在某部分不同的情况下使用，可以提高代码的复用率以及可扩展性。
 * 它的性质和策略模式比较相似，但策略模式是将一段操作封装成操作对象，通常不会包含全部的业务流程，
 * 但是模版方法是采用实现父类抽象方法达成的，因此会带有父类的整体业务流程操作。
 * 并且模板方法不一定是public，也可以protect这种有限制的，防止越权调用
 */
public class Main {
    public static void main(String[] args) {
        // Template1和Template2都具备相同但又独立的固定部分流程
        // 模板方法本意比较偏向不同对象但相同代码的复用与扩展，并且限制单一，
        // 通常只能使用一个实现类执行完整流程，通俗来讲就是重新制定流程路线
        // 但策略相对来说用的是同一个对象的相同部分代码，
        // 通过一个具备完整流程的对象嵌入多个不同的自定义操作实现流程的分支执行，通俗来讲就是分叉路的选择
        TemplateClass templateClass = new TemplateClassImplement1();
        System.out.println("template1: " + templateClass.getCode());
        templateClass.start();
        templateClass = new TemplateClassImplement2();
        System.out.println("template2: " + templateClass.getCode());
        templateClass.start();
    }
}